/// LoadingUtil 使用示例
/// 
/// 📚 本文件包含 LoadingUtil 的各种使用场景示例
/// 仅供学习参考，不会被打包到生产环境
library loading_util_examples;

import 'loading_util.dart';

/// ==================== 基础用法示例 ====================

/// 示例1: 简单的 Loading
/// 
/// 场景：提交表单、发送请求等
void example1_basic_loading() async {
  // 显示 Loading
  LoadingUtil.show('提交中...');
  
  // 模拟异步操作
  await Future.delayed(const Duration(seconds: 2));
  
  // 关闭 Loading
  LoadingUtil.dismiss();
  
  // 显示成功提示
  LoadingUtil.success('提交成功');
}

/// 示例2: 使用 execute() 自动处理（推荐）
/// 
/// 场景：任何需要 Loading 的异步操作
void example2_execute_method() async {
  final success = await LoadingUtil.execute(
    future: () async {
      // 模拟API请求
      await Future.delayed(const Duration(seconds: 2));
      // 如果需要返回数据
      return {'status': 'success'};
    },
    loadingText: '提交中...',
    successText: '提交成功',
  );
  
  if (success) {
    // 操作成功后的逻辑
    print('操作完成，可以跳转页面');
  }
}

/// ==================== 场景示例 ====================

/// 场景1: 登录流程
void scenario1_login() async {
  try {
    LoadingUtil.show('登录中...');
    
    // 1. 调用登录 API
    await Future.delayed(const Duration(seconds: 1));
    
    // 2. 更新提示
    LoadingUtil.show('获取用户信息...');
    await Future.delayed(const Duration(seconds: 1));
    
    // 3. 关闭 Loading
    LoadingUtil.dismiss();
    
    // 4. 显示成功
    LoadingUtil.success('登录成功！');
    
  } catch (e) {
    LoadingUtil.dismiss();
    LoadingUtil.error('登录失败: $e');
  }
}

/// 场景2: 文件上传（带进度）
void scenario2_file_upload() async {
  try {
    // 显示初始进度
    LoadingUtil.progress(0.0, status: '准备上传...');
    
    // 模拟上传进度
    for (double i = 0; i <= 1.0; i += 0.1) {
      LoadingUtil.progress(i, status: '上传中... ${(i * 100).toInt()}%');
      await Future.delayed(const Duration(milliseconds: 200));
    }
    
    // 完成
    LoadingUtil.dismiss();
    LoadingUtil.success('上传成功！');
    
  } catch (e) {
    LoadingUtil.dismiss();
    LoadingUtil.error('上传失败');
  }
}

/// 场景3: 数据加载
void scenario3_load_data() async {
  await LoadingUtil.execute(
    future: () async {
      // 模拟数据加载
      await Future.delayed(const Duration(seconds: 1));
      return [];
    },
    loadingText: '加载数据中...',
    showSuccess: false,  // 加载数据通常不需要显示成功提示
  );
}

/// 场景4: 简单操作反馈
void scenario4_simple_feedback() {
  // 收藏
  LoadingUtil.toast('已添加到收藏');
  
  // 复制
  LoadingUtil.toast('已复制到剪贴板');
  
  // 删除
  LoadingUtil.toast('删除成功');
}

/// ==================== 提示类型示例 ====================

/// 成功提示
void example_success() {
  // 默认 1 秒
  LoadingUtil.success('操作成功');
  
  // 自定义时长
  LoadingUtil.success(
    '操作成功',
    duration: const Duration(milliseconds: 1500),
  );
}

/// 错误提示
void example_error() {
  // 默认 2 秒
  LoadingUtil.error('操作失败，请重试');
  
  // 自定义时长（重要错误可以延长）
  LoadingUtil.error(
    '网络连接失败，请检查网络后重试',
    duration: const Duration(seconds: 3),
  );
}

/// 信息提示
void example_info() {
  // 默认 1 秒
  LoadingUtil.info('请先选择开始时间');
  
  // 自定义时长
  LoadingUtil.info(
    '请联系管理员',
    duration: const Duration(seconds: 2),
  );
}

/// Toast 轻提示
void example_toast() {
  // 默认中间显示
  LoadingUtil.toast('图片已删除');
  
  // 自定义显示时长
  LoadingUtil.toast(
    '正在处理...',
    duration: const Duration(seconds: 2),
  );
}

/// ==================== 高级用法 ====================

/// 防止重复提交
class FormController {
  bool isLoading = false;
  
  Future<void> submitForm() async {
    // 防止重复提交
    if (isLoading) return;
    
    isLoading = true;
    
    try {
      LoadingUtil.show('提交中...');
      
      await Future.delayed(const Duration(seconds: 2));
      
      LoadingUtil.dismiss();
      LoadingUtil.success('提交成功');
      
    } catch (e) {
      LoadingUtil.dismiss();
      LoadingUtil.error('提交失败');
    } finally {
      isLoading = false;
    }
  }
}

/// 使用 execute() 防止重复提交（推荐）
class FormController2 {
  bool isLoading = false;
  
  Future<void> submitForm() async {
    if (isLoading) return;
    
    isLoading = true;
    
    try {
      await LoadingUtil.execute(
        future: () => Future.delayed(const Duration(seconds: 2)),
        loadingText: '提交中...',
        successText: '提交成功',
      );
    } finally {
      isLoading = false;
    }
  }
}

/// ==================== 错误处理模式 ====================

/// 方式1: 手动处理
Future<void> errorHandling1() async {
  try {
    LoadingUtil.show('处理中...');
    
    // 可能抛出异常的操作
    await someAsyncOperation();
    
    // ✅ 先关闭 Loading，再显示 Success
    LoadingUtil.dismiss();
    LoadingUtil.success('操作成功');
    
  } catch (e) {
    // ✅ 异常时也要关闭 Loading
    LoadingUtil.dismiss();
    LoadingUtil.error('操作失败: $e');
  }
}

/// 方式2: 使用 execute()（推荐）
Future<void> errorHandling2() async {
  // ✅ 自动处理 Loading 的显示和关闭
  final success = await LoadingUtil.execute(
    future: () => someAsyncOperation(),
    loadingText: '处理中...',
    successText: '操作成功',
  );
  
  if (success) {
    // 成功后的操作
  }
}

/// ==================== 真实项目案例 ====================

/// 真实案例1: 用户登录
Future<void> realCase1_login(String username, String password) async {
  final success = await LoadingUtil.execute(
    future: () async {
      // 调用登录 API
      final result = await loginApi(username, password);
      if (!result['success']) {
        throw Exception(result['message']);
      }
      
      // 获取用户信息
      await getUserInfo();
      
      return result;
    },
    loadingText: '登录中...',
    successText: '登录成功！',
  );
  
  if (success) {
    // 延迟跳转
    await Future.delayed(const Duration(milliseconds: 1500));
    // Get.offAllNamed(Routes.home);
  }
}

/// 真实案例2: 发布内容
Future<void> realCase2_publish(Map<String, dynamic> data) async {
  // 表单验证
  if (!validateForm(data)) {
    LoadingUtil.error('请填写完整信息');
    return;
  }
  
  final success = await LoadingUtil.execute(
    future: () => publishApi(data),
    loadingText: '发布中...',
    successText: '发布成功',
  );
  
  if (success) {
    // Get.back();
  }
}

/// 真实案例3: 删除确认
Future<void> realCase3_delete(int id) async {
  // 先确认
  // final confirm = await showDeleteConfirmDialog();
  // if (!confirm) return;
  
  final success = await LoadingUtil.execute(
    future: () => deleteApi(id),
    loadingText: '删除中...',
    successText: '删除成功',
  );
  
  if (success) {
    // 刷新列表
    // controller.refreshList();
  }
}

/// ==================== 工具函数（模拟） ====================

Future<void> someAsyncOperation() async {
  await Future.delayed(const Duration(seconds: 1));
}

Future<Map<String, dynamic>> loginApi(String username, String password) async {
  await Future.delayed(const Duration(seconds: 1));
  return {'success': true, 'message': '登录成功'};
}

Future<void> getUserInfo() async {
  await Future.delayed(const Duration(milliseconds: 500));
}

bool validateForm(Map<String, dynamic> data) {
  return data.isNotEmpty;
}

Future<void> publishApi(Map<String, dynamic> data) async {
  await Future.delayed(const Duration(seconds: 1));
}

Future<void> deleteApi(int id) async {
  await Future.delayed(const Duration(milliseconds: 500));
}

